<?php

/**
 * winbinder 패키지 
 * 
 * 
 * @package php.ui.winbinder
 */


/**
 * WBTabControl
 *
 * @package php.ui.winbinder
 */
class WBTabControl extends WBControl { 
	
	private $_pageList = array();
	private $_pageObject = array();
	private $_rootPanel = array();

	
	public function __construct($options = array()) { 
		$options['class'] = TabControl;

		parent::__construct($options);
	}

	protected function initComponent() { 
		parent::initComponent();

		$this->setHandler();

		$this->setEvent('activate',		'onActivate');

		if (isset($this->tab))		$this->setTab($this->getOption('tab'));
		
		if (isset($this->controls)) { 
			foreach ($this->getOption('controls') as $control) { 
				$this->add($control);
			}
		}

	}

	/**
	 * TabControl 이벤트 전달 함수 
	 * 
	 * @param int $window
	 * @param int $id
	 * @param int $ctrl
	 * @param int $param1
	 * @param int $param2
	 */
	public function handler($window, $id, $ctrl = 0, $param1 = 0, $param2 = '') { 

		// 이벤트객체 (EventObject 생성 필요)
		$eventObject = new WBEvent($window, $id, $ctrl, $param1, $param2);

		// 이벤트 핸들러 연결 
		$this->setHandler();

		switch($id) { 
		case IDDEFAULT:			 
			// 윈도우 메인 이벤트
			$this->fire($eventObject);
			break;
		default: 
			// component 이벤트 
			$obj = wbobject($id);
			
			if ($obj) { 
				$obj->fire($eventObject);
			}  else { 
				$this->fireEvent('accel', $eventObject);
			}

			break;

		}
		
		unset($eventObject);
			
	}

	/**
	 * 이벤트가 전달될 handler 지정 
	 * 
	 */
	public function setHandler() { 
		wb_set_handler($this->getInstance(), '__tabcontrol_handler');
	}

	/**
	 * page 에 해당하는 tab index 얻어오기 
	 * 
	 * @param mixed $page 지정된 page 
	 * @return bool tab page 가 존재하는지 여부 
	 */
	public function getTabIndex($page = null) { 
		if (is_string($page)) { 
			return array_search($page, $this->_pageList);
		} else if (is_int($page)) { 
			return $page;
		} else if (is_null($page)) { 
			return $this->getActiveTab();
		}

		return false;
	}

	/**
	 * 탭 설정 
	 * 
	 * @param array $tab tab page 리스트 
	 */
	public function setTab($tab = array()) { 
		if (is_string($tab)) { 
			$tab = array_map('trim', explode("\n", $tab));
		} 

		foreach ($tab as $page) { 
			$this->addTab($page);
		}
	}

	/**
	 * Tab page 추가한다. 
	 * 
	 * @return int $tab
	 */
	public function addTab($tab, $layout = 'null') { 

		$tabIndex = $this->getTabIndex($tab);

		if ($tabIndex === false) { 

			// tab 문자열 추가 
			$this->_pageList[] = $tab;

			// tabIndex 구하기 
			$tabIndex = sizeof($this->_pageList)-1;

			// tab 생성 
			$this->createItems($tab);
			
			// tab에 루트패널 설정 
			$this->setRootPanel(new WBPanel(array('layout' => $layout)), $tab);
		} 
		
		return $tabIndex;
	}
	
	public function addPage($tab, $layout = 'null') { 
		$tabIndex = $this->addTab($tab, $layout);
		
		$this->_pageObject[$tabIndex] = new WBTabPage(array(
			'tabIndex' => $tabIndex,
			'tabControl' => $this,
		));
		
		return $this->_pageObject[$tabIndex];
	}
	
	/**
	 * get created tab page 
	 * 
	 * @param string|int $tab
	 * @return WBTabPage
	 */
	public function getPage($tab) { 
		return $this->_pageObject[$this->getTabIndex($tab)];
	}

	/**
	 * 지정된 탭 활성화 하기 
	 * 
	 * @param mixed $tab 선택될 tab 
	 */
	public function setActiveTab($tab) { 
		$this->setSelected($this->getTabIndex($tab), true);
	}

	/**
	 * 현재 활성화된 tab 얻어오기 
	 * 
	 * @return int
	 */
	public function getActiveTab() { 
		return $this->getSelected();
	}

	/**
	 * 각 tab의  rootPanel 얻어오기 
	 * 
	 * @param mixed $tab
	 * @return WBPanel
	 */
	public function getRootPanel($tab = null) { 
		return $this->_rootPanel[$this->getTabIndex($tab)];
	}

	/**
	 * tab 별 rootPanel 설정 
	 * 
	 * @param WBPanel $panel
	 * @param mixed $tab
	 */
	public function setRootPanel($panel = null, $tab = null ) { 
		if ($panel instanceof WBPanel) { 
			$this->_rootPanel[$this->getTabIndex($tab)] = $panel;
		}
	}
	
	public function setLayout($tab, $layout = null) { 
		$panel = $this->_rootPanel[$this->getTabIndex($tab)];
		
		if ($panel) { 
			$panel->setLayout($layout);
		}
	}

	/**
	 * rootPanel 에 컴포넌트 추가 하기 
	 * 
	 * component 에 tab 변수가 지정이 되어 있어야 함 
	 * 
	 * @param WBComponent $component
	 * @return mixed
	 */
	public function add($component) { 
		$component = wbcreate($component, $this);
		
		return $this->getRootPanel($component->getOption('ntab'))->add($component);
	}
	
	/**
	 * tab page 리스트 얻어오기 
	 * 
	 * @return array
	 */
	public function getTabList() { 
		return $this->_pageList;
	}
	
	public function getPageList() { 
		return $this->_pageObject;
	}

	/**
	 * 전체 tab panel 레이아웃 실행 
	 * 
	 * @see WBComponent#doLayout()
	 */
	public function doLayout() {
		$rect = $this->getSize(true);
		
		$rect['width'] -= 16;
		$rect['height'] -= 36;		
		
		foreach ($this->_rootPanel as $panel) { 
			if ($panel)  {
				$panel->setBounds($rect['x'], $rect['y'], $rect['width'], $rect['height']);
				$panel->doLayout();
			}
		}
	}
	
	public function setSize($width, $height) {
		wb_set_size($this->getInstance(), $width, $height);

		$this->fireEvent('resize');
		
		$this->_resizeTab();		

	}
	
	/**
	 * tab 사이즈 조절 필요, 위치, 크기 모두 
	 * 
	 * 1개 일 때 2개일때 모두 틀림 
	 * 
	 * @param unknown_type $obj
	 * @return number
	 */
	private function _resizeTab() { 
		$rect = $this->getBounds(true);
		
		$list = $this->extern('GetWindowList');
		
		$user = new WBUser();
		
		$style = WBUser::SWP_NOACTIVATE | WBUser::SWP_NOCOPYBITS | WBUser::SWP_NOOWNERZORDER | WBUser::SWP_NOREDRAW;

		$rect['width'] -= 16;
		$rect['height'] -= 36;
		
		foreach ($list as $i => $hwnd) {
			if ($i < count($this->_pageList)) {  // 화살표는 bounds 대상에 해당되지 않는다. 갯수만큼 지정 
				$user->SetWindowPos($hwnd, $rect['x'], $rect['y'], $rect['width'], $rect['height'], null, $style);
			}
		}
		
		unset($user);
	}	
	
	public function setVisible($isVisible) { 
		parent::setVisible($isVisible);
		
		foreach ($this->_rootPanel as $panel) { 
			if ($panel)  {
				$panel->setVisible($isVisible);
			}
		}
	}

	/**
	 * tab Control 관련 이벤트 실행 
	 * 
	 * header selected 이벤트 실행 
	 * 
	 * @see WBControl#fire($eo)
	 */
	public function fire($eo) { 
		parent::fire($eo);

		if ($eo->isHeaderSelected()) { $this->fireEvent('activate', $eo); return; }
	}

	/**
	 * tab 의 title 변경 
	 * 
	 * @param mixed $tab
	 * @param string $text
	 */
	public function setTabText($tab, $text) { 
		$this->setText($text, $this->getTabIndex($tab));
	}

	/**
	 * tab 의 title 얻어오기 
	 * 
	 * @param mixed $tab
	 * @return string tab 의 title 
	 */
	public function getTabText($tab) { 
		return $this->getText($this->getTabIndex($tab));
	}
	
	public function onActivate(WBEvent $eo) {
		// if current tab activated, do layout panel
		$panel = $this->getRootPanel($eo->tab);
		if ($panel) { 
			$panel->doLayout();
		}
	}

}

function __tabcontrol_handler($window, $id, $ctrl = 0, $param1 = 0, $param2 = '') { 
	wbObject(wb_get_id($window))->handler($window, $id, $ctrl, $param1, $param2);
}


?>
